CircleCI+ECS+ECR環境でDockerコンテナのCD(継続的デプロイ)環境を構築する -後編-
コンニチハ、千葉です。
後編です。前編では、ECRとECSの環境までを構築しました。ここからは、CircleCI側のセットアップを行いたいと思います。
流れとしては、以下で実施しようと思います。
- GitHubにコードをpushする
- CircleCI用のIAMユーザを作成し、アクセスキーを取得する
- CircleCIにGitHubのリポジトリをリンクする
- CircleCIにアクセスキーを登録する
- ビルドを実施
- デプロイされているはずなので、webにアクセスしてみる
セットアップしてみた
GitHubにコードをpushする
こちらをforkするなり、zipでダウンロードして自分のリポジトリにコミットしGitHubへpushします。コードは特に変更せずそのまま登録すれば問題無いです。
local$ tree . ├── Dockerfile # Dockerコンテナを定義 ├── LICENSE ├── README.md ├── circle.yml # CircleCIで実施する、コンテナのビルドやテスト、デプロイコマンドを実行するように定義 ├── deploy.sh # ECRへのコンテナイメージをpush、ECSへのコンテナをデプロイする ├── requirements.txt └── static-html-directory # Nginxで公開するコンテンツを格納 └── index.html
動作の簡単な解説です(circle.ymlに何を行うか定義しています)
- Dockerfileに定義している内容で、コンテナイメージを作成します。Dockerfileには、nginxコンテナイメージでコンテナを起動すること、static-html-directoryをnginx公開フォルダにコピーすること、ポート80番をバインドすることを定義しています。
- テストとして、1でビルドしたコンテナを起動して80ポートへアクセスし、"Hello World"が表示されるかを確認します。
- deploy.shを実行します。ここでは、ビルドしたコンテナイメージのアップロード、ECSへのコンテナデプロイを実施します。
CircleCI用のIAMユーザを作成し、アクセスキーを取得する
AWSのマネジメントコンソールにて、CircleCI用のIAMユーザを作成します。ポリシーは、「AmazonEC2ContainerRegistryFullAccess」と「AmazonEC2ContainerServiceFullAccess」をアタッチします。 また、アクセスキーを取得しておきます。(後で実施する手順でCircleCIに登録します)
CircleCIにGitHubのリポジトリをリンクする
まだ、AWSアクセスキーを登録していないのでビルドは失敗します。
CircleCIにアクセスキーを登録する
AWSアカウントID、アクセスキーをCircleCI実施時の環境変数として登録します
以下の3つを環境変数として登録します。ここで定義した環境変数はCirclCIでビルドを実行するときに利用します。
- AWS_ACCOUNT_ID
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
ビルドの実施
セットアップが完了したのでビルドを実施してみます。
FAILDとなっているタスクをクリックします。
リビルドします。
ビルドが成功しているはずです!また、ECSへのデプロイも完了しています。今回ECSクラスタは2台構成なので、ローリングアップデート方式によりコンテナが更新されます。
デプロイされているはずなので、webにアクセスしてみる
それでは、アクセスできるか確認してみます!
ちゃんとデプロイされています!
これでCI環境ができたので、今後変更が発生した場合はGitHubへpushしたタイミングで自動でECSへデプロイされるようになります。手動でやらなくていいので、とても効率的です。
まとめ
CircleCIを使った、ECS+ECR環境への継続的デプロイができるようになりました。継続的って聞くとハードル高い?と思うことがあるかもしれませんが、1度導入すると効率的な開発やリリースが可能になるため離れられなくなると思います。破壊力あります。これを機会にCI/CD環境の導入を検討してはいかがでしょうか。